package com.shangma.cn.controller;

import com.github.pagehelper.PageHelper;
import com.shangma.cn.common.http.AxiosResult;
import com.shangma.cn.common.page.PageBean;
import com.shangma.cn.common.perm.HasPerm;
import com.shangma.cn.common.valid.group.*;
import com.shangma.cn.controller.base.BaseController;
import com.shangma.cn.dto.MenuDTO;
import com.shangma.cn.entity.Menu;
import com.shangma.cn.query.MenuQuery;
import com.shangma.cn.service.MenuService;
import com.shangma.cn.transfer.MenuTransfer;
import com.shangma.cn.utils.FormValidUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 开发者：辉哥
 * 特点： 辉哥很帅
 * 开发时间：2021/6/22 11:00
 * <p>
 * ssm的时候 跨域
 *
 * @CrossOrigin 第二种方式：
 * 《mvc:cors》
 * <p>
 * <p>
 * 第三种方式：
 * 在springmvc的配置类中 重写方法
 * <p>
 * <p>
 * 第四种：
 * Filter
 * <p>
 * 第五种：
 * 向容器中添加CorsFilter（添加在父容器中）
 * <p>
 * web.xml或者替代web.xml的哪个类中  使用DelegatingFilterProxy 添加到web的Filter中
 * <p>
 * axios.get("http://localhost:10086/findById?id=?")
 * 文件说明：
 */
@RestController
@RequestMapping("menu")
@Api(tags = "菜单管理", description = "菜单管理")
public class MenuController extends BaseController {


    /**
     * 为了避免不手写接口完档  此时可以使用postman
     * <p>
     * 此时可以使用postman
     * 为什么使用postman
     * 1: 后台程序开发controller  由于此时没有前端页面衬托  此时需要测试controller
     * 此时需要使用postman来测试
     * <p>
     * 2： 测试完了之后 controller没有错误 此时把测试接口保存起来
     * <p>
     * 3: 项目写完了  在postman中 也测试完了 此时也说 保存完了
     * <p>
     * 4：  把保存后的导出  给前端就可以了
     * <p>
     * <p>
     * <p>
     * swagger2 通过配置+注解的方式 自动生成接口文档
     */

    @Autowired
    private MenuService menuService;


    @Autowired
    private MenuTransfer menuTransfer;


    @ApiOperation(value = "分页条件查询")
    @GetMapping("searchPage")
    public AxiosResult<PageBean<MenuDTO>> searchPage(MenuQuery MenuQuery) {
        //开启分页
        PageHelper.startPage(MenuQuery.getCurrentPage(), MenuQuery.getPageSize());
        PageBean<MenuDTO> pageBean = menuService.searchPage(MenuQuery);
        return AxiosResult.success(pageBean);
    }

//    @ApiOperation(value = "查询所有")
//    @GetMapping
//    public AxiosResult<List<Menu>> list() {
//        return AxiosResult.success(menuService.list());
//    }

    @GetMapping("{id}")
    @ApiOperation(value = "id查询")
    public AxiosResult<MenuDTO> findById(@PathVariable Long id) {
        return AxiosResult.success(menuTransfer.toDTO(menuService.findById(id)));
    }

    @PostMapping
    @ApiOperation(value = "添加菜单")
    @HasPerm(permSign = "system:menu:add")
    public AxiosResult add(@Validated(AddGroup.class) @RequestBody Menu Menu) {
        Integer menuType = Menu.getMenuType();
        if (menuType == 1) {
            //判断目录相关的内容
            FormValidUtils.valid(Menu, DirectoryGroup.class);
        }
        if (menuType == 2) {
            //判断的是菜单
            FormValidUtils.valid(Menu, MenuGroup.class);
        }
        if (menuType == 3) {
            //判断按钮
            FormValidUtils.valid(Menu,BtnGroup.class);

        }

        return toAxios(menuService.add(Menu));
    }

    @PutMapping
    @ApiOperation(value = "修改菜单")
    @HasPerm(permSign = "system:menu:edit")
    public AxiosResult<Void> update(@RequestBody @Validated(UpdateGroup.class) Menu Menu) {
        //判断表单校验有没有成功
        Integer menuType = Menu.getMenuType();
        if (menuType == 1) {
            //判断目录相关的内容
            FormValidUtils.valid(Menu, DirectoryGroup.class);
        }
        if (menuType == 2) {
            //判断的是菜单
            FormValidUtils.valid(Menu, MenuGroup.class);
        }
        if (menuType == 3) {
            //判断按钮
            FormValidUtils.valid(Menu,BtnGroup.class);

        }

        return toAxios(menuService.update(Menu));
    }

    @DeleteMapping("{id}")
    @ApiOperation(value = "通过id删除")
    @HasPerm(permSign = "system:menu:delete")
    public AxiosResult<Void> deleteById(@PathVariable Long id) {
        int row = menuService.cascadeDeleteChildren(id);
        return toAxios(row);
    }


    /**
     * 获得select框中选择的内容
     */
    @GetMapping("getTreeData")
    @ApiOperation(value = "获取选择框中的数据")
    public AxiosResult<List<MenuDTO>> getSelectTreeData() {
        List<MenuDTO> list = menuService.getTreeData();
        return AxiosResult.success(list);
    }



}
